// es5变通函数的默认值

function undefindFunc(x, y) {
    // 假设不传参或者只传一个参，那么没有值怎么办，所以这个时候就需要一个默认值
    var x = x || 0,
        y = y || 0;
    if (typeof y === 'undefined') {
        y = 0;
    }
    return x + y;
};

// undefindFunc(); //输出0
// undefindFunc(2); //输出2
// undefindFunc(2, 3); //输出5
// undefindFunc(2, 3, 4); //输出5
// // 这种写法的缺点在于，如果参数y赋值了，但是对应的布尔值为false，则该赋值不起作用。就像上面代码的最后一行，参数y等于空字符，结果被改为默认值。所以要在上面判断
// undefindFunc(2, '');//返回值为2


// 但是es6就不用那么麻烦了  es6有了默认参数
function fun1(x = 1, y = 1) {
    return x + y;
}

// console.log(fun1(3,5));

//es5
// function fun1(x, y) {
//     if (x === void 0) { x = 1; }
//     if (y === void 0) { y = 1; }
//     return x + y;
// }
// console.log(fun1(2, 3));


// 与解构赋值结构默认值
function foo({x,y=5}){
    console.log(x,y);
}
// foo({});//undefined 5
// foo({x:2,y:3})//2 3

// 解构赋值的变量位置不影响应有的值
// foo({y:2,x:3})//3 2

//rest参数

// ES6引入rest参数(形式为...变量名)，用于获取函数的多余参数，这样就不需要使用arguments对象，rest参数搭配的变量是一个数组，该变量将多余的参数放入数组中

function add(...value) {
    let sum = 0;
    for (const val of value) {
        sum += val
    }
    return sum;
}

// es5的写法
function add_1() {
    var value = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        value[_i] = arguments[_i];
    }
    var sum = 0;
    for (var _a = 0, value_1 = value; _a < value_1.length; _a++) {
        var val = value_1[_a];
        sum += val;
    }
    return sum;
}
// console.log(add(2,5,6,4,5,8,5));